/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controle;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.LinkedList;
import modelo.ElementoPasta;

/**
 *
 * @author root
 */
public class Pasta {
    
    private LinkedList <ElementoPasta> filhos;
    private long finalArquivo;
    private RandomAccessFile arquivo;
    private long deslocamento;
    
    public Pasta(RandomAccessFile arquivo, Long deslocamento) throws IOException {
        this.arquivo = arquivo;
        this.deslocamento = deslocamento;
        
        finalArquivo = 0;
        filhos = new LinkedList<ElementoPasta>();
        byte nameLenght;
        
        arquivo.seek(deslocamento);
        ElementoPasta elemento;
        
        while ( true ) {
            elemento = new ElementoPasta();
            elemento.ninis = arquivo.readInt();
            
            if ( elemento.ninis == 0 ) break;
            
            elemento.length = arquivo.readShort();
            nameLenght = arquivo.readByte();
            elemento.tipo = (arquivo.readByte() == 0) ? false : true;
            elemento.nome = new byte[nameLenght];
            arquivo.read(elemento.nome);
            elemento.lixo = new byte[elemento.length - (nameLenght + 8)];
            arquivo.read(elemento.lixo);
            
            finalArquivo += elemento.length;
            filhos.add(elemento);
        }
    }
    
    public int getNinisOf ( String nomeArquivo ) {
        for ( int i = 0; i < filhos.size(); i++ )
            if ( nomeArquivo.equals( new String ( filhos.get(i).nome ) ) ) return filhos.get(i).ninis;
        return -1;
    }
    
    public boolean isPasta ( String nomeArquivo ) {
        for ( int i = 0; i < filhos.size(); i++ )
            if ( nomeArquivo.equals( new String ( filhos.get(i).nome ) ) ) return filhos.get(i).tipo;
        return false;
    }
    
    public void inserir (String nomeArquivo, int ninis, boolean tipo) throws IOException {
        ElementoPasta a = new ElementoPasta();
        a.ninis = ninis;
        a.nome = nomeArquivo.getBytes();
        a.lixo = new byte[ 4 - (a.nome.length % 4) ];
        for ( int i = 0; i < a.lixo.length; i++ )
            a.lixo[i] = '\0';
        a.tipo = tipo;
        a.length = (short)(a.lixo.length + a.nome.length + 8);
        
        filhos.add(a);
        
        arquivo.seek(deslocamento + finalArquivo);
        arquivo.writeInt(a.ninis);
        arquivo.writeShort(a.length);
        arquivo.writeByte((byte)a.nome.length);
        arquivo.writeByte((a.tipo) ? 0x0001 : 0x0000);
        arquivo.write(a.nome);
        arquivo.write(a.lixo);
    }
    
    public String listar () {
        if ( filhos.isEmpty() ) return "A pasta está vazia";
        String r = new String();
        for ( int i = 0; i < filhos.size(); i++ )
            r += new String(filhos.get(i).nome) + "; ";
        return r;
    }
}
